#ifndef __M_UTIL_H__    // 防止头文件被重复包含
#define __M_UTIL_H__

#include <iostream>
#include <string>
#include <fstream>
#include <sstream>
#include <ctime>
#include <cassert>
#include <sys/stat.h>
#include <sys/types.h>
namespace cl{
    /**
     * @brief util 类提供了一些通用的功能，如获取系统时间、文件操作等。
     * 
     * 包括：获取当前时间戳、获取文件大小、创建目录、获取文件所在目录等。
     */
    namespace util{
    // 日期类：用于获取当前系统时间
    class date{
    public:
        // 获取当前时间的时间戳
        static time_t now(){ return time(nullptr); }
    };

    // 文件操作类：提供与文件相关的通用功能
    class file{
    public:
        // 检查文件是否存在
        static bool exists(const std::string &name){
            struct stat st;
            return stat(name.c_str(), &st) == 0;
        }
        // 获取文件所在目录
        static std::string path(const std::string &name){
            if(name.empty()) return ".";
            size_t pos = name.find_last_of("/\\");
            // 如果没找到路径分隔符，返回当前目录
            if(pos == std::string::npos) return ".";
            return name.substr(0, pos + 1);
        }
        // 创建目录及其所在父目录
        static void create_directory(const std::string &path){
            if(path.empty()) return;    // 如果路径为空，直接返回
            if(exists(path)) return;    // 如果目录已存在，直接返回

            size_t pos, idx = 0;
            while(idx < path.size()){
                pos = path.find_first_of("/\\", idx);
                // 找不到更多的分隔符，创建最后一个目录
                if(pos == std::string::npos){
                    mkdir(path.c_str(), 0755);
                    return;
                }
                // 如果分隔符位于开头，继续查找
                if(pos == idx) { 
                    idx = pos + 1; 
                    continue; 
                }
                std::string subdir = path.substr(0, pos);
                // 忽略当前目录和上级目录
                if(subdir == "." || subdir == "..") { 
                    idx = pos + 1; 
                    continue; 
                }
                // 创建子目录
                mkdir(subdir.c_str(), 0755);
                idx = pos + 1;  // 更新索引
            }
        }
    }; // class file
    }
}
#endif